package GestorPruebas;
/**
 * @file Prueba.java
 * @brief Implementa la clase Prueba
 *
 * Implementa la clase Prueba usada para manejar la información de
 * los pruebas del sistema.
 *
 * @author Antonio M. Gutierrez Martinez
 * @version 01.00
 *
 */

import Controlador.UsuariosDisponibles;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.Date;

import GestorUsuarios.*;


public class Prueba {

    /**
     * @brief Id de la prueba
     */
    protected Integer _idPrueba;
    /**
     * @brief Estado en que se encuentra la prueba
     */
    protected EstadoPrueba _estado;
    /**
     * @brief Fecha en la que el paciente realiza la prueba
     */
    protected Date _fecha;
    /**
     * @brief Fecha en la que se han obtenido los resultados de las pruebas
     */
    protected Date _fechaResultados;
    /**
     * @brief Tipo de prueba medica a realizar
     */
    protected TipoPrueba _tipo;
    /**
     * @brief Id de la cita donde se mando la prueba
     */
    protected Integer _idCita;
    /**
     * @brief Id del medico que solicito la realizacion de la prueba medica
     */
    protected Integer _idMedico;
    /**
     * @brief Id del paciente al que se le realiza la prueba
     */
    protected Integer _idPaciente;

    /**
     * @brief Id del tecnico de pruebas que realiza la prueba
     */
    protected Integer _idTecnicoPruebas;

    /**
     * @brief Constructor de la clase prueba
     */
    public Prueba( EstadoPrueba estado ,Date fecha, Date fechaResultado,
            TipoPrueba tipo, Integer idCita ,Integer idMedico, Integer idPaciente,
            Integer idTecnicoPruebas ) // Por qué no creas un constructor pasandole el ID y así evitas ponerlo protected?!
                                       // o diles que sino utilicen SETIDPRUEBA! ;) (yo lo cambie a protected para quitar sus fallos, =))
    {
        this._idPrueba = null;
        this._estado = estado;
        this._fecha = fecha;
        this._fechaResultados = fechaResultado;
        this._tipo = tipo;
        this._idCita = idCita;
        this._idMedico = idMedico;
        this._idPaciente = idPaciente;
        this._idTecnicoPruebas = idTecnicoPruebas;
    }

    /**
     * @brief Constructor por defecto
     */
    public Prueba() {
        this._idPrueba = null;
        this._estado = null;
        this._fecha = null;
        this._fechaResultados = null;
        this._tipo = null;
        this._idCita = null;
        this._idMedico = null;
        this._idPaciente = null;
        this._idTecnicoPruebas = null;
    }

    /**
     * @brief Añade un objeto prueba al sistema
     * @param p prueba
     * @throws ClassNotFoundException, IOException, SQLException,
     * NoSuchAlgorithmException , IDException
     */
    public static void add(Prueba p) throws SQLException, IOException,
            ClassNotFoundException, IDException, NoSuchAlgorithmException{
        PruebaDAO.add(p);
    }

    /**
     * @brief Elimina logicamente un objeto prueba del sistema
     * @param p prueba
     * @throws ClassNotFoundException, IOException, SQLException, NoSuchAlgorithmException
     */
    public static void delete(Prueba p) throws SQLException, IOException,
            ClassNotFoundException, NoSuchAlgorithmException{
        PruebaDAO.delete(p);
    }

    /**
     * @brief Elimina un objeto prueba del sistema
     * @param p prueba
     * @throws ClassNotFoundException, IOException, SQLException, NoSuchAlgorithmException
     */
    public static void deleteHard(Prueba p) throws SQLException, IOException,
            ClassNotFoundException, NoSuchAlgorithmException{
        PruebaDAO.deleteHard(p);
    }

    /**
     * @brief Obtiene un objeto prueba que coincide con el id pasado como argumento
     * @param id id del objeto a buscar
     * @throws ClassNotFoundException, IOException, SQLException, NoSuchAlgorithmException
     */
    public static Prueba get(int id) throws SQLException, IOException,
            ClassNotFoundException, NoSuchAlgorithmException, ParseException{
        return PruebaDAO.get(id);
    }

    /**
     * @brief Obtiene las pruebas que tienen el estado indicado o que fueron solicitadas en la fecha indicada
     *      o ambas cosas
     * @param e estado de la prueba a buscar
     * @param f fecha de la prueba a buscar
     * @throws ClassNotFoundException, IOException, SQLException, NoSuchAlgorithmException
     */
    public static Prueba[] get(Integer idCita , Integer idMedico, Integer idPaciente,
            Integer idTecnicoPruebas , EstadoPrueba e, TipoPrueba t, Date fInicio, Date fFin) throws SQLException,
            IOException, ClassNotFoundException, IDException, NoSuchAlgorithmException, ParseException{
	return PruebaDAO.get(idCita,idMedico,idPaciente,idTecnicoPruebas,e,t,fInicio,fFin);
    }

    /**
     * @brief Obtiene las fechas disponibles para solicitar una prueba medica
     * @param i fecha inicio
     * @param f fecha fin
     * @throws ClassNotFoundException, IOException, SQLException, NoSuchAlgorithmException
     */
    public static UsuariosDisponibles[] getFechasDisponibles(Date i, Date f)
            throws SQLException, IOException, ClassNotFoundException, NoSuchAlgorithmException{
	return PruebaDAO.getFechasDisponibles(i, f);
    }
    

    /**
     * @brief Actualiza en le sistema una prueba
     * @param p prueba
     * @throws ClassNotFoundException, IOException, SQLException, NoSuchAlgorithmException
     */
    public static void update(Prueba p) throws SQLException, IOException, ClassNotFoundException, IDException, NoSuchAlgorithmException{
        PruebaDAO.update(p);
    }

    /**
     * @brief Obtiene el id de la prueba
     */
    public Integer getIdPrueba(){
    	return this._idPrueba;
    }

    /**
     * @brief  Obtiene el estado de la prueba
     */
    public EstadoPrueba getEstadoPrueba(){
    	return this._estado;
    }

    /**
     * @brief Obtiene la fecha de la prueba
     */
    public Date getFecha(){
	return this._fecha;
    }

    /**
     * @brief Obtiene la fecha de los resultados de una prueba
     */
    public Date getFechaResultados() {
        return this._fechaResultados;
    }

    /**
     * @brief Obtiene el tipo de prueba medica
     */
    public TipoPrueba getTipo(){
    	return this._tipo;
    }

    /**
     * @brief Obtiene el id del paciente
     */
    public Integer getIdPaciente() {
        return this._idPaciente;
    }

    /**
     * @brief Obtiene el id del medico
     */
    public Integer getIdMedico() {
        return this._idMedico;
    }

    /**
     * @brief Obtiene el id de la cita
     *
     */
    public Integer getIdCita() {
        return this._idCita;
    }

    /**
     * @brief Obtiene el id del tecnico de pruebas
     */
    public Integer getIdTecnicoPruebas() {
        return this._idTecnicoPruebas;
    }



    /**
     * @brief Asigna el id de la prueba
     * @param id a asignar
     */
    public void setIdPrueba(Integer id){
        this._idPrueba = id;
    }
    
    /**
     * @brief Asigna el estado de la prueba
     * @param estado a asignar
     */
    public void setEstadoPrueba(EstadoPrueba estado){
        this._estado = estado;
    }

    /**
     * @brief Asigna la fecha de realizacion de una prueba
     * @param fecha a asignar
     */
    public void setFecha(Date fecha){
        this._fecha = fecha;
    }

    /**
     * @brief Asigna la fecha donde se realizaron los resultados
     * @param fechaResultados a asignar
     */
    public void setFechaResultados(Date fechaResultados){
        this._fechaResultados = fechaResultados;
    }
    
    /**
     * @brief Asigna el tipo de la prueba
     * @param t tipo de la prueba a asignar
     */
    public void setTipo(TipoPrueba t){
        this._tipo = t;
    }   

    /**
     * @brief Asigna el id del paciente
     * @param id del paciente
     */
    public void setIdPaciente(int id){
        this._idPaciente = id;
    }

    /**
     * @brief Asigna el id del medico
     * @param id del medico
     */
    public void setIdMedico(int id){
        this._idMedico = id;
    }

    /**
     * @brief Asigna el id de la cita
     * @param id de la cita
     */
    public void setIdCita(int id){
        this._idCita = id;
    }

    /**
     * @brief Asigna el id del tecnico de pruebas
     * @param id del tecnico de pruebas
     */
    public void setIdTecnicoPruebas(int id){
        this._idTecnicoPruebas = id;
    }

}
